using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SmartMedicalRAG.Core.Services;
using SmartMedicalRAG.Core.Models;
using SmartMedicalRAG.Infrastructure.SemanticKernel;
using SmartMedicalRAG.Api.Services;

/// <summary>
/// 智慧医疗 RAG 系统 - 应用程序入口点
/// 作用：配置和启动智慧医疗分诊 API 服务
/// 功能：服务注册、中间件配置、依赖注入设置
/// 技术栈：.NET 8.0、ASP.NET Core、依赖注入、Swagger 文档
/// </summary>
var builder = WebApplication.CreateBuilder(args);

// ==================== 服务容器配置 ====================
// 作用：配置应用程序所需的各种服务

// 添加控制器服务 - 支持 API 控制器
// 作用：启用 ASP.NET Core 的控制器功能，处理 HTTP 请求
builder.Services.AddControllers();

// 添加 API 端点探索器 - 支持 API 发现
// 作用：自动发现和注册 API 端点，为 Swagger 文档生成提供支持
builder.Services.AddEndpointsApiExplorer();

// 添加 Swagger 生成器 - API 文档和测试界面
// 作用：生成交互式 API 文档，便于开发人员测试和调试 API
// 功能：自动生成 API 文档、提供在线测试界面、支持请求/响应示例
builder.Services.AddSwaggerGen(c =>
{
    // 设置 Swagger 文档信息
    c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
    {
        Title = "智慧医疗 RAG 系统 API",
        Version = "v1",
        Description = "基于检索增强生成技术的智能医疗分诊系统 API",
        Contact = new Microsoft.OpenApi.Models.OpenApiContact
        {
            Name = "智慧医疗团队",
            Email = "support@smartmedical.com"
        }
    });

    // 读取 XML 文档文件，用于显示中文注释
    var xmlFile = $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
    if (File.Exists(xmlPath))
    {
        c.IncludeXmlComments(xmlPath);
    }

    // 读取 Core 项目的 XML 文档
    var coreXmlFile = "SmartMedicalRAG.Core.xml";
    var coreXmlPath = Path.Combine(AppContext.BaseDirectory, coreXmlFile);
    if (File.Exists(coreXmlPath))
    {
        c.IncludeXmlComments(coreXmlPath);
    }

    // 读取 Infrastructure 项目的 XML 文档
    var infraXmlFile = "SmartMedicalRAG.Infrastructure.xml";
    var infraXmlPath = Path.Combine(AppContext.BaseDirectory, infraXmlFile);
    if (File.Exists(infraXmlPath))
    {
        c.IncludeXmlComments(infraXmlPath);
    }
});

// ==================== 日志配置 ====================
// 作用：配置应用程序的日志记录功能，便于调试和监控

// 配置日志服务
builder.Services.AddLogging(logging =>
{
    // 添加控制台日志提供程序 - 开发环境调试
    // 作用：将日志输出到控制台，便于开发时查看
    logging.AddConsole();
    
    // 添加调试日志提供程序 - Visual Studio 调试
    // 作用：在 Visual Studio 调试窗口中显示日志信息
    logging.AddDebug();
});

// ==================== 业务服务注册 ====================
// 作用：注册应用程序的核心业务服务，实现依赖注入

// 注册多模态数据服务 - 处理各种类型的数据
// 作用：处理文本、语音、图像、生理信号等多种数据类型
// 功能：数据预处理、特征提取、语义分析
builder.Services.AddScoped<IMultimodalDataService, MultimodalDataService>();

// 注册真实医疗分析服务 - 智能分诊建议生成
// 作用：基于真实医学知识，生成专业的医疗分诊建议
// 功能：症状分析、疾病诊断、科室推荐、风险评估
builder.Services.AddScoped<IRAGGenerationService, RealMedicalAnalysisService>();

// 注册 Semantic Kernel 服务 - AI 模型集成
// 作用：集成 Microsoft Semantic Kernel，支持大语言模型调用
// 功能：AI 模型管理、提示工程、响应生成
builder.Services.AddScoped<SemanticKernelService>();

// ==================== 多模态处理器注册 ====================
// 作用：注册各种数据类型的处理器，支持多模态数据处理

// 注册文本处理器 - 处理文本数据
// 作用：处理患者主诉、病史、医生记录等文本信息
// 功能：文本标准化、实体提取、语义分析
builder.Services.AddScoped<ITextProcessor, TextProcessor>();

// 注册语音处理器 - 处理语音数据
// 作用：处理患者语音描述、症状语音等音频信息
// 功能：语音识别、语义理解、情感分析
builder.Services.AddScoped<IVoiceProcessor, VoiceProcessor>();

// 注册图像处理器 - 处理图像数据
// 作用：处理医学影像、皮肤病变、X光片等图像信息
// 功能：图像分割、特征提取、病变识别
builder.Services.AddScoped<IImageProcessor, ImageProcessor>();

// 注册生理信号处理器 - 处理生理数据
// 作用：处理心电图、血压、体温等生理信号数据
// 功能：异常检测、时间序列分析、趋势预测
builder.Services.AddScoped<IPhysiologicalSignalProcessor, PhysiologicalSignalProcessor>();

// ==================== 知识检索服务注册 ====================
// 作用：注册知识检索和 AI 生成相关的服务

// 注册知识检索服务 - 医学知识库检索
// 作用：从医学知识库中检索相关信息，支持分诊决策
// 功能：语义搜索、混合检索、多跳推理
builder.Services.AddScoped<IKnowledgeRetrievalService, KnowledgeRetrievalService>();

// 注册 LLM 服务 - 大语言模型调用
// 作用：调用大语言模型，生成智能分诊建议
// 功能：内容生成、推理分析、自然语言处理
builder.Services.AddScoped<ILLMService, LLMService>();

// 注册提示工程师 - 提示词优化
// 作用：构建和优化提示词，提高 AI 生成质量
// 功能：提示词设计、上下文构建、参数优化
builder.Services.AddScoped<IPromptEngineer, PromptEngineer>();

// 注册事实验证器 - 结果验证
// 作用：验证 AI 生成结果的准确性和可靠性
// 功能：事实检查、逻辑验证、一致性检查
builder.Services.AddScoped<IFactChecker, FactChecker>();

// ==================== 应用程序构建 ====================
// 作用：构建 Web 应用程序实例

var app = builder.Build();

// ==================== HTTP 请求管道配置 ====================
// 作用：配置 HTTP 请求的处理流程

// 开发环境配置
if (app.Environment.IsDevelopment())
{
    // 启用 Swagger UI - API 文档和测试界面
    // 作用：在开发环境中提供交互式 API 文档
    // 功能：API 端点浏览、在线测试、请求/响应示例
    app.UseSwagger();
    
    // 启用 Swagger UI 界面 - 可视化 API 文档
    // 作用：提供美观的 Web 界面来浏览和测试 API
    // 访问路径：/swagger
    app.UseSwaggerUI();
}

// 启用 HTTPS 重定向 - 安全连接
// 作用：将 HTTP 请求重定向到 HTTPS，确保数据传输安全
// 功能：自动重定向、安全协议升级
app.UseHttpsRedirection();

// 启用授权中间件 - 身份验证和授权
// 作用：处理用户身份验证和权限控制
// 功能：JWT 验证、角色授权、权限检查
app.UseAuthorization();

// 映射控制器路由 - API 端点注册
// 作用：将 HTTP 请求路由到相应的控制器方法
// 功能：路由匹配、参数绑定、响应处理
app.MapControllers();

// 添加根路径重定向 - 用户友好的入口
// 作用：当用户访问根路径时，自动重定向到 Swagger 文档
// 功能：简化访问、提升用户体验
// 访问路径：/ → 重定向到 /swagger
app.MapGet("/", () => Results.Redirect("/swagger"));

// ==================== 应用程序启动 ====================
// 作用：启动 Web 服务器，开始监听 HTTP 请求

/// <summary>
/// 启动应用程序
/// 作用：启动 Kestrel Web 服务器，开始处理 HTTP 请求
/// 功能：
/// - 监听配置的端口（默认 5000/5001）
/// - 处理 HTTP/HTTPS 请求
/// - 路由请求到相应的控制器
/// - 提供 Swagger 文档界面
/// - 支持健康检查和监控
/// 
/// 启动后的访问地址：
/// - API 文档：https://localhost:端口/swagger
/// - 健康检查：https://localhost:端口/api/triage/health
/// - 分诊分析：https://localhost:端口/api/triage/analyze
/// - 根路径：https://localhost:端口/
/// </summary>
app.Run(); 